package org.truenewx.tnxjee.service.spec.fsm;

import org.truenewx.tnxjee.model.entity.unity.Unity;
import org.truenewx.tnxjee.model.spec.user.UserIdentity;

/**
 * 状态转换动作
 *
 * @param <U> 单体类型
 * @param <S> 状态枚举类型
 * @param <T> 转换枚举类型
 * @param <I> 用户标识类型
 * @author jianglei
 */
public interface StateTransitAction<U extends Unity<?>, S extends Enum<S>, T extends Enum<T>, I extends UserIdentity<?>> {

    /**
     * @return 当前动作对应的转换
     */
    T getTransition();

    /**
     * 转换发生前的处理，一般用于校验
     *
     * @param unity   要转换状态的单体
     * @param context 状态转换上下文
     */
    default void prepare(U unity, StateTransitContext<S, I> context) {
    }

    /**
     * 转换发生后的处理，一般用于记录转换日志
     *
     * @param unity   要转换状态的单体
     * @param context 状态转换上下文
     */
    default void done(U unity, StateTransitContext<S, I> context) {
    }

}
